
package GUI;

import controladoresJPA.ConnectionFactory;
import controladoresJPA.UsuarioJpaController;
import controladoresJPA.exceptions.IllegalOrphanException;
import controladoresJPA.exceptions.NonexistentEntityException;
import controladoresJPA.exceptions.PreexistingEntityException;
import entregapersistencia.Usuario;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

/**
 * @author Hern&aacute;ndez Abahonza Diana Carolina 1031083
 * @author L&oacute;pez Juan Camilo
 * @author Moncada Mu&nacute;oz Juan David
 */
public class PanelUsuario extends JPanel implements ActionListener {
    
    private JLabel lUsuario;
    private ArrayList<JLabel> lDatosUsuario;
    private ArrayList<JTextField> tfDatosUsuario;
    private ArrayList<String> stDatosUsuario;
    private JButton bCrear;
    private JButton bModificar;
    private JButton bEliminar;
    
    private ConnectionFactory fabrica;
    private UsuarioJpaController controlador;
    private Usuario usuario;
    
    public PanelUsuario(){
        this.setLayout(new BorderLayout(5,0));//ec, ef
	
	inicializarComponentes();
	organizarComponentes();
    }
    
    private void inicializarComponentes() {
        fabrica = new ConnectionFactory();
        controlador = new UsuarioJpaController(fabrica.getFactory());
        usuario = new Usuario();
        
        lUsuario = new JLabel( "Gestión Usuarios",new ImageIcon("images/users-96x96.png"),SwingConstants.LEFT );
	lUsuario.setFont(new Font("Arial", Font.BOLD, 18));
	lUsuario.setForeground(new Color(78,79,99,190));
        
        lDatosUsuario = new ArrayList<JLabel>();
        lDatosUsuario.add( new JLabel( "Username" ) );
        lDatosUsuario.add( new JLabel( "Nombres y Apellidos" ) );
        lDatosUsuario.add( new JLabel( "Contraseña" ) );
        lDatosUsuario.add( new JLabel( "Repita Contraseña" ) );
        lDatosUsuario.add( new JLabel( "Tipo de Usuario" ) );
        lDatosUsuario.add( new JLabel( "Código de la Sucursal" ) );
        
        tfDatosUsuario = new ArrayList<JTextField>();
        stDatosUsuario = new ArrayList<String>();
        
        for(int i=0; i<lDatosUsuario.size(); i++){
            lDatosUsuario.get(i).setFont(new Font("Arial", Font.BOLD, 14));
            lDatosUsuario.get(i).setForeground(new Color(78,79,99,190));
            
            tfDatosUsuario.add( new JTextField( "" ) );
	}
        
        bCrear = new JButton("Crear");
        configurarBoton(bCrear);
		
	bModificar = new JButton("Modificar");
	configurarBoton(bModificar);
		
	bEliminar = new JButton("Eliminar");
	configurarBoton(bEliminar);
    }
    
    private void configurarBoton(JButton boton){
        boton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
	boton.setRolloverEnabled(false); // Quita la iluminacion al pasar el mouse por el boton 
	//boton.setBorderPainted(false); // Quita el borde del boton
	boton.setBackground(new Color(0,0,0,0)); // Fondo Transparente
	boton.addActionListener(this); // Escucha del boton
    }

    private void organizarComponentes() {
        JPanel pTexto = new JPanel();
        pTexto.setBorder(BorderFactory.createEmptyBorder(180,110,15,110));//n,w,s,e
	pTexto.setBackground(new Color(0,0,0,0));
	pTexto.add(lUsuario);
		
	JPanel pFormulario = new JPanel(new GridLayout(lDatosUsuario.size(),2,0,0));//i,j,esp_i, esp_j
	pFormulario.setBorder(BorderFactory.createEmptyBorder(15,110,15,110));//n,w,s,e
	pFormulario.setBackground(new Color(0,0,0,0));
	for(int i=0; i<lDatosUsuario.size(); i++){
		pFormulario.add(lDatosUsuario.get(i));
		pFormulario.add(tfDatosUsuario.get(i));
	}
		
	JPanel pBotones = new JPanel(new GridLayout(1,3,5,0));
	pBotones.setBorder(BorderFactory.createEmptyBorder(15,110,180,110));//n,w,s,e
	pBotones.setBackground(new Color(0,0,0,0));
	pBotones.add(bCrear);
	pBotones.add(bModificar);
	pBotones.add(bEliminar);
		
	this.add(pTexto, BorderLayout.NORTH);
	this.add(pFormulario, BorderLayout.CENTER);
	this.add(pBotones, BorderLayout.SOUTH);
    }   

    
    private void capturarDatos() {
        stDatosUsuario.clear();
        stDatosUsuario.add(tfDatosUsuario.get(0).getText());
        stDatosUsuario.add(tfDatosUsuario.get(1).getText());
        stDatosUsuario.add(tfDatosUsuario.get(2).getText());
        stDatosUsuario.add(tfDatosUsuario.get(3).getText());
        stDatosUsuario.add(tfDatosUsuario.get(4).getText());
        stDatosUsuario.add(tfDatosUsuario.get(5).getText());
    }
    
    private void crearUsuario() {
        capturarDatos();
        if(tfDatosUsuario.get(2).getText().equals(tfDatosUsuario.get(3).getText())){
            usuario.setIdentificacion(stDatosUsuario.get(0));
            usuario.setNombre(stDatosUsuario.get(1));
            usuario.setPassword(stDatosUsuario.get(2));
            usuario.setTipoUsuario(stDatosUsuario.get(4));
            try {
                controlador.create(usuario);
                JOptionPane.showMessageDialog(this, "Usuario ingresado exitosamente.");
            } catch (PreexistingEntityException ex) {
                Logger.getLogger(PanelUsuario.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(this, "Usuario ya existente.");
            } catch (Exception ex) {
                Logger.getLogger(PanelUsuario.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(this, "Usuario no ingresado.");
            }
        }else{
            JOptionPane.showMessageDialog(this, "Contraseñas distintas.");
            capturarDatos();
        }
    }

    private void modificarUSuario() {
        capturarDatos();

        usuario.setIdentificacion(stDatosUsuario.get(0));
        usuario.setNombre(stDatosUsuario.get(1));
        usuario.setPassword(stDatosUsuario.get(2));
        usuario.setTipoUsuario(stDatosUsuario.get(4));
        try {        
            controlador.edit(usuario);
            JOptionPane.showMessageDialog(this, "Usuario modificado exitosamente.");
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(PanelUsuario.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(PanelUsuario.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(this, "El usuario con username " +usuario.getIdentificacion()+ " no existe.");
        } catch (Exception ex) {
            Logger.getLogger(PanelUsuario.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(this, "Usuario no modificado.");
        }
    }

    private void eliminarUsuario() {
        capturarDatos();

        String id = stDatosUsuario.get(0);
        try {
            controlador.destroy(id);
            JOptionPane.showMessageDialog(this, "Usuario eliminado exitosamente.");
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(PanelUsuario.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(PanelUsuario.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(this, "El usuario con username " +usuario.getIdentificacion()+ " no existe.");
        } catch (Exception ex) {
            Logger.getLogger(PanelUsuario.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(this, "Usuario no eliminado.");
        }
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        if(ae.getSource()==bCrear){
            crearUsuario();
	}
		
	if(ae.getSource()==bModificar){
            modificarUSuario();
	}
		
	if(ae.getSource()==bEliminar){
            eliminarUsuario();
	}
    }
}
